#pragma once
#include "BaseService.h"
#include <string>
#include <fstream>
#include <memory>
#include <mutex>
#include <cstdarg>

namespace core {

/**
 * @brief 日志级别枚举
 */
enum class LogLevel {
    TRACE,    ///< 跟踪信息
    DEBUG,    ///< 调试信息
    INFO,     ///< 一般信息
    WARNING,  ///< 警告信息
    ERROR,    ///< 错误信息
    FATAL     ///< 致命错误
};

/**
 * @brief 日志服务实现
 */
class LoggerService : public BaseService {
public:
    explicit LoggerService(const std::string& name);
    ~LoggerService() override;

    bool initialize() override;
    bool initialize(const std::string& logFilePath);
    std::string getName() const override;

    /**
     * @brief 设置日志级别
     * @param level 日志级别
     */
    void setLogLevel(LogLevel level);

    /**
     * @brief 获取当前日志级别
     * @return 当前日志级别
     */
    LogLevel getLogLevel() const;

    /**
     * @brief 记录跟踪信息
     * @param message 日志消息
     */
    void trace(const std::string& message);

    /**
     * @brief 记录格式化跟踪信息
     * @param format 格式化字符串
     * @param ... 可变参数
     */
    void tracef(const char* format, ...);

    /**
     * @brief 记录调试信息
     * @param message 日志消息
     */
    void debug(const std::string& message);

    /**
     * @brief 记录格式化调试信息
     * @param format 格式化字符串
     * @param ... 可变参数
     */
    void debugf(const char* format, ...);

    /**
     * @brief 记录一般信息
     * @param message 日志消息
     */
    void info(const std::string& message);

    /**
     * @brief 记录格式化一般信息
     * @param format 格式化字符串
     * @param ... 可变参数
     */
    void infof(const char* format, ...);

    /**
     * @brief 记录警告信息
     * @param message 日志消息
     */
    void warning(const std::string& message);

    /**
     * @brief 记录格式化警告信息
     * @param format 格式化字符串
     * @param ... 可变参数
     */
    void warningf(const char* format, ...);

    /**
     * @brief 记录错误信息
     * @param message 日志消息
     */
    void error(const std::string& message);

    /**
     * @brief 记录格式化错误信息
     * @param format 格式化字符串
     * @param ... 可变参数
     */
    void errorf(const char* format, ...);

    /**
     * @brief 记录致命错误
     * @param message 日志消息
     */
    void fatal(const std::string& message);

    /**
     * @brief 记录格式化致命错误
     * @param format 格式化字符串
     * @param ... 可变参数
     */
    void fatalf(const char* format, ...);

    /**
     * @brief 启用/禁用文件输出
     * @param enabled 是否启用
     */
    void setFileOutputEnabled(bool enabled);

    /**
     * @brief 启用/禁用控制台输出
     * @param enabled 是否启用
     */
    void setConsoleOutputEnabled(bool enabled);

    /**
     * @brief 设置日期格式
     * @param format 日期格式字符串
     */
    void setDateFormat(const std::string& format);

    /**
     * @brief 设置日志格式
     * @param format 日志格式字符串，支持以下占位符：
     *   %d - 日期时间
     *   %l - 日志级别
     *   %n - 日志器名称
     *   %m - 日志消息
     */
    void setLogFormat(const std::string& format);

private:
    void log(LogLevel level, const std::string& message);
    std::string levelToString(LogLevel level) const;
    std::string getCurrentDateTime() const;

    std::string name_;
    LogLevel logLevel_ = LogLevel::INFO;
    std::string dateFormat_ = "%Y-%m-%d %H:%M:%S";
    bool fileOutputEnabled_ = false;
    bool consoleOutputEnabled_ = true;
    std::ofstream logFile_;
    std::mutex logMutex_;
};

} // namespace core